import { ecs } from "../../../../core/ecs/ECS";
import { RenderComponent } from "../componet/renderComponet";
import { HealthComponent } from "../componet/HealthComponent";
import { LevelComponent } from "../componet/LevelComponent";
import { ScoreComponent } from "../componet/ScoreComponent";

/**
 * 玩家实体（重构版 - 完全组件化）
 * 
 * 重构说明：
 * ❌ 旧版：将 health, level, score 等数据直接放在 Entity 中
 * ✅ 新版：所有游戏数据都封装成 Component
 * 
 * 优势：
 * 1. 组件可复用（Enemy 也能用 HealthComponent）
 * 2. 系统可以单独查询（HealthSystem 处理所有有生命的实体）
 * 3. 数据组织清晰
 * 4. 符合 ECS 架构原则
 * 
 * @example
 * // 创建玩家
 * const player = ecs.getEntity(PlayerRefactored);
 * 
 * // 使用组件
 * player.HealthComponent.takeDamage(30);
 * player.LevelComponent.addExperience(150);
 * player.ScoreComponent.add(100);
 * 
 * // 使用便捷方法
 * player.takeDamage(30);
 * player.addScore(100);
 */
@ecs.register('PlayerRefactored')
export class PlayerRefactored extends ecs.Entity {
    // ============================================
    // 组件声明
    // ============================================
    
    /** 渲染组件 */
    RenderComponent!: RenderComponent;
    
    /** 生命值组件 - 替代原来的 maxHealth/currentHealth */
    HealthComponent!: HealthComponent;
    
    /** 等级组件 - 替代原来的 level */
    LevelComponent!: LevelComponent;
    
    /** 分数组件 - 替代原来的 score */
    ScoreComponent!: ScoreComponent;
    
    // ============================================
    // Entity 特有属性（可选）
    // ============================================
    
    // 只有实体唯一标识和元数据可以放在这里
    
    /** 玩家 ID（账号 ID，不是游戏内数据） */
    public playerId: string = "";
    
    /** 玩家昵称 */
    public playerName: string = "";
    
    // ❌ 不要再这样做：
    // public maxHealth: number = 100;     // 应该用 HealthComponent
    // public currentHealth: number = 100; // 应该用 HealthComponent
    // public level: number = 1;           // 应该用 LevelComponent
    // public score: number = 0;           // 应该用 ScoreComponent
    
    /**
     * 初始化方法 - 必须实现！
     */
    init(): void {
        // 添加所有组件
        this.add(RenderComponent);
        this.add(HealthComponent);
        this.add(LevelComponent);
        this.add(ScoreComponent);
        
        // 重置 Entity 属性
        this.playerId = "";
        this.playerName = "";
        
        // ✅ 组件会自动调用 reset()，不需要手动重置组件数据
    }
    
    // ============================================
    // 便捷方法（可选的语法糖）
    // ============================================
    
    /**
     * 检查是否存活
     */
    isAlive(): boolean {
        return this.HealthComponent.isAlive();
    }
    
    /**
     * 受到伤害
     */
    takeDamage(damage: number): void {
        this.HealthComponent.takeDamage(damage);
        
        if (!this.isAlive()) {
            this.onDeath();
        }
    }
    
    /**
     * 治疗
     */
    heal(amount: number): void {
        this.HealthComponent.heal(amount);
    }
    
    /**
     * 增加分数
     */
    addScore(points: number): void {
        this.ScoreComponent.add(points);
    }
    
    /**
     * 添加经验值
     * @returns 是否升级了
     */
    addExperience(exp: number): boolean {
        const leveledUp = this.LevelComponent.addExperience(exp);
        
        if (leveledUp) {
            this.onLevelUp();
        }
        
        return leveledUp;
    }
    
    /**
     * 死亡处理
     */
    private onDeath(): void {
        console.log(`${this.playerName || 'Player'} died!`);
        this.RenderComponent.visible = false;
        
        // 复杂的死亡逻辑应该通过事件或 System 处理
    }
    
    /**
     * 升级处理
     */
    private onLevelUp(): void {
        const newLevel = this.LevelComponent.level;
        console.log(`${this.playerName || 'Player'} leveled up to ${newLevel}!`);
        
        // 升级时增加最大生命值
        this.HealthComponent.increaseMaxHealth(10);
        
        // 复杂的升级逻辑应该在 System 中处理
    }
    
    /**
     * 获取玩家信息摘要
     */
    getSummary(): string {
        return `${this.playerName} (Lv.${this.LevelComponent.level}) ` +
               `HP: ${this.HealthComponent.current}/${this.HealthComponent.max} ` +
               `Score: ${this.ScoreComponent.value}`;
    }
}

